package com.qf.controller;

import com.qf.config.RedisLockUtil;
import org.apache.curator.framework.CuratorFramework;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * 模拟秒杀抢购
 * @author 千锋健哥
 */
@RestController
public class SeckillController {

    @Autowired
    private CuratorFramework cf;

    @Autowired
    private RedisLockUtil redisLockUtil;

    //存储商品以及库存
    public static Map<String, Integer> itemStock = new HashMap<>();

    //用来保存订单
    public static Map<String, Integer> itemOrder = new HashMap<>();

    /**
     * 初始化数据
     */
    static {
        //初始化商品库存
        itemStock.put("wawa", 10000);
        //初始化订单
        itemOrder.put("wawa", 0);
    }


    /**
     * 模拟秒杀下单
     * @return
     */
    @GetMapping("/kill/{item}")
    public String kill(@PathVariable(value = "item") String item) throws Exception {

        //====================zookeeper 加锁begin============
        //获取锁对象
        //InterProcessMutex lock = new InterProcessMutex(cf, "/lock");
        //判断是否获取到锁, 超时时间1秒, 防止死锁
       // if (lock.acquire(1, TimeUnit.SECONDS)) {
            //====================zookeeper 加锁end============


        //===================redis 加锁begin===================
        if (redisLockUtil.lock("lock", String.valueOf(System.currentTimeMillis()), 1)) {
        //===================redis  加锁end=====================
            //1. 判断库存是否充足, 不充足不允许下单
            Integer count = itemStock.get(item);
            if (count <= 0) {
                return "库存不足";
            }
            //2. 扣减库存
            itemStock.put(item, count - 1);


            //3. 保存订单
            itemOrder.put(item, itemOrder.get(item) + 1);

            //===============zookeeper 解锁  begin==============
            //lock.release();
            //===============zookeeper 解锁  end==============

            //=================redis  解锁beign================
            redisLockUtil.unlock("lock");
            //=================redis   解锁end=================
            //4. 返回数据
            return  "抢购成功, 当前订单量为: " + itemOrder.get(item) +", 库存量为:" + itemStock.get(item);

        } else {
            return "没有抢购到!, 丢弃连接!";
        }


    }


}
